package Utils;

import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Adriano
 */
public class Gramatica {

    private List<Producao> producoes;

    public Gramatica() {
        this.producoes = new ArrayList<>();
        initGramatica();
    }
    
    public Producao getByProduto(List<TipoProducao> produzido){
        for (Producao p: producoes){
            if (p.produz(produzido))
                return p;
        }
        return null;
    }
    
    
    private void initGramatica() {
        Producao p;
        
        //PROGRAMA
        p = new Producao(TipoProducao.PROGRAMA);
        p.addProduto(TipoProducao.TRACO_MAIOR);
        p.addProduto(TipoProducao.PROGRAM);
        p.addProduto(TipoProducao.ABRE_COLCHETES_PARENTESE);
        p.addProduto(TipoProducao.IDENT_LIST);
        p.addProduto(TipoProducao.FECHA_PARENT_COLCHETE_PONTO_VIRGULA);
        p.addProduto(TipoProducao.BLOCO);
        this.producoes.add(p);
        
        p = new Producao(TipoProducao.IDENT_LIST);
        p.addProduto(TipoProducao.TRACO_MAIOR);
        p.addProduto(TipoProducao.IDENTIFIER);
        p.addProduto(TipoProducao.SEQ_IDENT);
        this.producoes.add(p);
        
        p = new Producao(TipoProducao.SEQ_IDENT);
        p.addProduto(TipoProducao.TRACO_MAIOR);
        p.addProduto(TipoProducao.VIRGULA);
        p.addProduto(TipoProducao.IDENTIFIER);
        p.addProduto(TipoProducao.SEQ_IDENT);
        p.addProduto(TipoProducao.BARRA_EM_PE);
        p.addProduto(TipoProducao.LAMBDA);
        this.producoes.add(p);
        
        p = new Producao(TipoProducao.BLOCO);
        p.addProduto(TipoProducao.TRACO_MAIOR);
        p.addProduto(TipoProducao.ABRE_COLCHETES_CONSTANTE);
        p.addProduto(TipoProducao.DEF_CONST);
        p.addProduto(TipoProducao.FECHA_COLCHETE);
        p.addProduto(TipoProducao.BARRA_EM_PE);
        p.addProduto(TipoProducao.ABRE_COLCHETE_TYPE);
        p.addProduto(TipoProducao.DEF_TYPE);
        p.addProduto(TipoProducao.FECHA_COLCHETE);
        p.addProduto(TipoProducao.BARRA_EM_PE);
        p.addProduto(TipoProducao.ABRE_COLCHETE);
        p.addProduto(TipoProducao.VAR);
        p.addProduto(TipoProducao.ABRE_COLCHETE);
        p.addProduto(TipoProducao.DEF_VAR);
        p.addProduto(TipoProducao.FECHA_COLCHETE);
        p.addProduto(TipoProducao.ABRE_COLCHETE);
        p.addProduto(TipoProducao.DEF_SUBPROG);
        p.addProduto(TipoProducao.FECHA_COLCHETE);
        p.addProduto(TipoProducao.BARRA_EM_PE);
        p.addProduto(TipoProducao.BEGIN);
        p.addProduto(TipoProducao.LISTA_COMA);
        p.addProduto(TipoProducao.END);
        this.producoes.add(p);
        
        p = new Producao(TipoProducao.DEF_CONST);
        p.addProduto(TipoProducao.TRACO_MAIOR);
        p.addProduto(TipoProducao.IDENT_LIST);
        p.addProduto(TipoProducao.IGUAL);
        p.addProduto(TipoProducao.CONSTANTE);
        p.addProduto(TipoProducao.PONTO_VIRGULA);
        p.addProduto(TipoProducao.DEF_CONST);
        p.addProduto(TipoProducao.BARRA_EM_PE);
        p.addProduto(TipoProducao.LAMBDA);
        this.producoes.add(p);
        
        p = new Producao(TipoProducao.DEF_TYPE);
        p.addProduto(TipoProducao.TRACO_MAIOR);
        p.addProduto(TipoProducao.IDENT_LIST);
        p.addProduto(TipoProducao.IGUAL);
        p.addProduto(TipoProducao.TYPE);
        p.addProduto(TipoProducao.PONTO_VIRGULA);
        p.addProduto(TipoProducao.DEF_TYPE);
        p.addProduto(TipoProducao.BARRA_EM_PE);
        p.addProduto(TipoProducao.LAMBDA);
        this.producoes.add(p);
        
        p = new Producao(TipoProducao.DEF_VAR);
        p.addProduto(TipoProducao.TRACO_MAIOR);
        p.addProduto(TipoProducao.IDENT_LIST);
        p.addProduto(TipoProducao.DOIS_PONTOS);
        p.addProduto(TipoProducao.TYPE);
        p.addProduto(TipoProducao.PONTO_VIRGULA);
        p.addProduto(TipoProducao.DEF_VAR);
        p.addProduto(TipoProducao.BARRA_EM_PE);
        p.addProduto(TipoProducao.LAMBDA);
        this.producoes.add(p);
        
        p = new Producao(TipoProducao.DEF_SUBPROG);
        p.addProduto(TipoProducao.TRACO_MAIOR);
        p.addProduto(TipoProducao.DEF_PROC);
        p.addProduto(TipoProducao.PONTO_VIRGULA);
        p.addProduto(TipoProducao.DEF_SUBPROG);
        p.addProduto(TipoProducao.BARRA_EM_PE);
        p.addProduto(TipoProducao.DEF_FUNC);
        p.addProduto(TipoProducao.PONTO_VIRGULA);
        p.addProduto(TipoProducao.DEF_SUBPROG);
        p.addProduto(TipoProducao.BARRA_EM_PE);
        p.addProduto(TipoProducao.LAMBDA);
        this.producoes.add(p);
        
        p = new Producao(TipoProducao.DEF_PROC);
        p.addProduto(TipoProducao.TRACO_MAIOR);
        p.addProduto(TipoProducao.PROCEDURE);
        p.addProduto(TipoProducao.IDENTIFIER);
        p.addProduto(TipoProducao.ABRE_COLCHETES_PARENTESE);
        p.addProduto(TipoProducao.PARAMT);
        p.addProduto(TipoProducao.FECHA_PARENT_COLCHETE_PONTO_VIRGULA);
        p.addProduto(TipoProducao.BLOCO);
        this.producoes.add(p);
        
        p = new Producao(TipoProducao.DEF_FUNC);
        p.addProduto(TipoProducao.TRACO_MAIOR);
        p.addProduto(TipoProducao.FUNCTION);
        p.addProduto(TipoProducao.IDENTIFIER);
        p.addProduto(TipoProducao.ABRE_COLCHETES_PARENTESE);
        p.addProduto(TipoProducao.PARAMT);
        p.addProduto(TipoProducao.FECHA_PARENT_COLCHETE_PONTO_VIRGULA);
        p.addProduto(TipoProducao.DOIS_PONTOS);
        p.addProduto(TipoProducao.TYPE);
        p.addProduto(TipoProducao.PONTO_VIRGULA);
        p.addProduto(TipoProducao.BLOCO);
        this.producoes.add(p);
        
        p = new Producao(TipoProducao.PARAMT);
        p.addProduto(TipoProducao.TRACO_MAIOR);
        p.addProduto(TipoProducao.DEF_PARAMT);
        p.addProduto(TipoProducao.PARAMT_LIS);
        this.producoes.add(p);
        
        p = new Producao(TipoProducao.PARAMT_LIS);
        p.addProduto(TipoProducao.TRACO_MAIOR);
        p.addProduto(TipoProducao.PONTO_VIRGULA);
        p.addProduto(TipoProducao.DEF_PARAMT);
        p.addProduto(TipoProducao.PARAMT_LIS);
        p.addProduto(TipoProducao.BARRA_EM_PE);
        p.addProduto(TipoProducao.LAMBDA);
        this.producoes.add(p);
        
        p = new Producao(TipoProducao.DEF_PARAMT);
        p.addProduto(TipoProducao.TRACO_MAIOR);
        p.addProduto(TipoProducao.ABRE_COLCHETE);
        p.addProduto(TipoProducao.VAR);
        p.addProduto(TipoProducao.FECHA_COLCHETE);
        p.addProduto(TipoProducao.IDENT_LIST);
        p.addProduto(TipoProducao.DOIS_PONTOS);
        p.addProduto(TipoProducao.TYPE);
        this.producoes.add(p);
        
        p = new Producao(TipoProducao.TYPE);
        p.addProduto(TipoProducao.TRACO_MAIOR);
        p.addProduto(TipoProducao.INTEGER);
        p.addProduto(TipoProducao.BARRA_EM_PE);
        p.addProduto(TipoProducao.REAL);
        p.addProduto(TipoProducao.BARRA_EM_PE);
        p.addProduto(TipoProducao.CHAR);
        p.addProduto(TipoProducao.BARRA_EM_PE);
        p.addProduto(TipoProducao.BOOLEAN);
        p.addProduto(TipoProducao.BARRA_EM_PE);
        p.addProduto(TipoProducao.ALFA);
        this.producoes.add(p);
        
        p = new Producao(TipoProducao.LISTA_COMA);
        p.addProduto(TipoProducao.TRACO_MAIOR);
        p.addProduto(TipoProducao.COMANDO);
        p.addProduto(TipoProducao.SEQ_COMAND);
        this.producoes.add(p);
        
        p = new Producao(TipoProducao.SEQ_COMAND);
        p.addProduto(TipoProducao.TRACO_MAIOR);
        p.addProduto(TipoProducao.PONTO_VIRGULA);
        p.addProduto(TipoProducao.COMANDO);
        p.addProduto(TipoProducao.SEQ_COMAND);
        p.addProduto(TipoProducao.BARRA_EM_PE);
        p.addProduto(TipoProducao.LAMBDA);
        this.producoes.add(p);
        
        p = new Producao(TipoProducao.COMANDO);
        p.addProduto(TipoProducao.TRACO_MAIOR);
        p.addProduto(TipoProducao.IDENTIFIER);
        p.addProduto(TipoProducao.DOIS_PONTOS_IGUAL);
        p.addProduto(TipoProducao.EXPRESSAO);
        p.addProduto(TipoProducao.BARRA_EM_PE);
        p.addProduto(TipoProducao.BEGIN);
        p.addProduto(TipoProducao.LISTA_COMA);
        p.addProduto(TipoProducao.END);
        p.addProduto(TipoProducao.BARRA_EM_PE);
        p.addProduto(TipoProducao.IF);
        p.addProduto(TipoProducao.EXPRESSAO);
        p.addProduto(TipoProducao.THEN);
        p.addProduto(TipoProducao.COMANDO);
        p.addProduto(TipoProducao.CLAUSULA_E);
        p.addProduto(TipoProducao.BARRA_EM_PE);
        p.addProduto(TipoProducao.REAPEAT);
        p.addProduto(TipoProducao.LISTA_COMA);
        p.addProduto(TipoProducao.UNTIL);
        p.addProduto(TipoProducao.EXPRESSAO);
        p.addProduto(TipoProducao.BARRA_EM_PE);
        p.addProduto(TipoProducao.WHILE);
        p.addProduto(TipoProducao.EXPRESSAO);
        p.addProduto(TipoProducao.DO);
        p.addProduto(TipoProducao.COMANDO);
        p.addProduto(TipoProducao.BARRA_EM_PE);
        p.addProduto(TipoProducao.FOR);
        p.addProduto(TipoProducao.IDENTIFIER);
        p.addProduto(TipoProducao.DOIS_PONTOS_IGUAL);
        p.addProduto(TipoProducao.EXPRESSAO);
        p.addProduto(TipoProducao.INC);
        p.addProduto(TipoProducao.EXPRESSAO);
        p.addProduto(TipoProducao.DO);
        p.addProduto(TipoProducao.COMANDO);
        p.addProduto(TipoProducao.BARRA_EM_PE);
        p.addProduto(TipoProducao.LAMBDA);
        this.producoes.add(p);
        
        p = new Producao(TipoProducao.CLAUSULA_E);
        p.addProduto(TipoProducao.TRACO_MAIOR);
        p.addProduto(TipoProducao.ELSE);
        p.addProduto(TipoProducao.BARRA_EM_PE);
        p.addProduto(TipoProducao.LAMBDA);
        this.producoes.add(p);   
        
        p = new Producao(TipoProducao.INC);
        p.addProduto(TipoProducao.TRACO_MAIOR);
        p.addProduto(TipoProducao.TO);
        p.addProduto(TipoProducao.BARRA_EM_PE);
        p.addProduto(TipoProducao.DOWNTO);
        this.producoes.add(p);
     
    }

}
